/**
 * https://leetcode-cn.com/problems/number-of-islands/
 * 岛屿数量
 * 给你一个由 '1'（陆地）和 '0'（水）组成的的二维网格，请你计算网格中岛屿的数量。岛屿总是被水包围，并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外，你可以假设该网格的四条边均被水包围。
 * @param grid
 */
const numIslands = (grid: string[][]): number => {
  if (grid.length === 0) return 0;

  // 行数量
  const row = grid.length;
  // 列数量
  const col = grid[0].length;

  let ans = 0;
  for (let i = 0; i < row; i++) {
      for (let j = 0; j < col; j++) {
          if (grid[i][j] === '1') { // 是1
              ans++
              dfs(grid, i, j, row, col) // 把和当前在一起的是1的标记为0
          }
      }
  }
  return ans
};

/**
 * 把和1连续的标记为0
 */
const dfs = (grid: string[][], i: number, j: number, row: number, col: number) => {
    // 边界判断
    if (i < 0 || j < 0 || i >= row || j >= col) return;

    // 如果已经是0了, 也不处理
    if (grid[i][j] === '0') return;

    // 将当前标记为0
    grid[i][j] = '0';

    // 标记下一行
    dfs(grid, i - 1, j, row, col)
    // 标记上一列
    dfs(grid, i, j - 1, row, col)
    // 标记上一行
    dfs(grid, i + 1, j, row, col)
    // 标记下一列
    dfs(grid, i, j + 1, row, col)
};
